﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using FatusoAction.Model;
using System.Net;
using System.IO;
using System.Text.RegularExpressions;
using System.Collections.Specialized;
using System.Configuration;
using System.IO.Compression;
using System.Xml.Linq;
using System.Diagnostics;

namespace FatusoAction
{
    public class EpisodioAction
    {
        #region [Recupera Listas de Episódios]

        public static List<EpisodioModel> RecuperaEpisodio(TipoVideo tipo, TituloModel titulo, int maxContadorEpisodio)
        {
            return RecuperaEpisodio_KatPH(tipo, titulo, maxContadorEpisodio);
        }

        public static List<EpisodioModel> RecuperaEpisodio_KatPH(TipoVideo tipo, TituloModel titulo, int maxContadorEpisodio)
        {
            try
            {
                string nomeRelease = titulo.Release;
                string termoUri = termoUri = Uri.EscapeDataString(nomeRelease);
                string url_busca = "http://kickass.to/usearch/" + termoUri + "?field=seeders&sorder=desc";
                HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(url_busca);
                myRequest.Headers.Add(HttpRequestHeader.AcceptEncoding, "gzip,deflate");
                myRequest.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
                myRequest.Method = "GET";

                HttpWebResponse myResponse = (HttpWebResponse)myRequest.GetResponse();
                StreamReader sr = new StreamReader(myResponse.GetResponseStream());
                string result = sr.ReadToEnd();
                sr.Close();
                myResponse.Close();

                List<EpisodioModel> episodios = new List<EpisodioModel>();

                //Elimina Registro Inicial
                string auxPattern = "TORRENT NAME";// "results 1";
                var auxRegex = new Regex(auxPattern, RegexOptions.IgnoreCase);
                MatchCollection auxMatches = auxRegex.Matches(result);
                if (auxMatches.Count == 0)
                {
                    Console.WriteLine(">Nao foram encontrados episodios para este release.");
                    return new List<EpisodioModel>();
                }

                string resultsFiltrado = result.Substring(auxMatches[0].Index).Replace(auxPattern, "");

                //Busca Torrents
                string pattern = "'name': '";
                var regex = new Regex(pattern, RegexOptions.IgnoreCase);
                MatchCollection matches = regex.Matches(resultsFiltrado);
                if (matches.Count == 0)
                {
                    Console.WriteLine(">Nao foram encontrados episodios para este release.");
                    return new List<EpisodioModel>();
                }

                int contador = 1;
                foreach (Match match in matches)
                {
                    #region [Recupera Dados do Episódio]
                    string tempMatch = resultsFiltrado.Substring(match.Index).Replace(pattern, "");

                    //Recupera Nome do Release
                    int index = tempMatch.IndexOf('\'');
                    string release = Uri.UnescapeDataString(tempMatch.Substring(0, index).Trim());

                    if (FolderAndXMLAction.SerieEquivalente(nomeRelease, release, tipo))
                    {
                        //URL para Download
                        tempMatch = tempMatch.Substring(index + 1);
                        index = tempMatch.IndexOf("<p class=\"data\">");
                        string pattern2 = "<a title=\"Download torrent file\" href=\"";
                        var regex2 = new Regex(pattern2, RegexOptions.IgnoreCase);
                        MatchCollection matches2 = regex2.Matches(tempMatch);
                        if (matches2.Count == 0)
                            throw new Exception("Nao foram encontrados episodios para este release.");
                        tempMatch = tempMatch.Substring(matches2[0].Index).Replace(pattern2, "");
                        index = tempMatch.IndexOf("?title");
                        string urlDownload = tempMatch.Substring(0, index);

                        //Salva na lista de Torrents
                        EpisodioModel episodioModel = new EpisodioModel();
                        episodioModel.Tipo = TipoVideo.Serie;
                        episodioModel.Fonte = EpisodioFonte.KatPH;
                        episodioModel.Release = FolderAndXMLAction.FiltraCaracteres(release.Replace('\\', '_').Replace('/', '_'), true);
                        episodioModel.URLDownload = urlDownload;
                        episodioModel.NomePasta = FolderAndXMLAction.RecuperaNomePastaVideo(release, tipo);

                        episodios.Add(episodioModel);

                        if (contador >= maxContadorEpisodio) break;
                        contador++;
                    }
                    #endregion
                }

                if (episodios.Count == 0)
                {
                    Console.WriteLine("Nao foram encontrados episodios para este release.");
                    return new List<EpisodioModel>();
                }

                return episodios;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        #endregion

        #region [Download de Episódio]

        public static void DownloadEpisodio(EpisodioModel episodio, TipoVideo tipoVideo, TituloModel titulo)
        {
            DownloadEpisodio_KatPH(episodio, tipoVideo, titulo);
        }

        public static void DownloadEpisodio_KatPH(EpisodioModel episodio, TipoVideo tipoVideo, TituloModel titulo)
        {
            #region [OLD]
            //string downloadurl = episodio.URLDownload;

            //using (var client = new WebClient())
            //{
            //    var values = new NameValueCollection();
            //    int indexFile = episodio.URLDownload.LastIndexOf('.');
            //    string extension = episodio.URLDownload.Substring(indexFile);

            //    string caminhoDownload = ConfigurationSettings.AppSettings["CaminhoDownloadTorrent"].TrimEnd('\\');
            //    string filename = caminhoDownload;

            //    if (!Directory.Exists(filename)) Directory.CreateDirectory(filename);

            //    filename += "\\" + episodio.Release + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + extension;
            //    client.DownloadFile(downloadurl, filename);

            //}
            #endregion

            string releaseComando = titulo.Release;

            byte[] result;
            byte[] buffer = new byte[4096];

            WebRequest wr = WebRequest.Create(episodio.URLDownload);
            wr.ContentType = "application/x-bittorrent";
            using (WebResponse response = wr.GetResponse())
            {
                bool gzip = response.Headers["Content-Encoding"] == "gzip";
                var responseStream = gzip
                                        ? new GZipStream(response.GetResponseStream(), CompressionMode.Decompress)
                                        : response.GetResponseStream();

                using (MemoryStream memoryStream = new MemoryStream())
                {
                    int count = 0;
                    do
                    {
                        count = responseStream.Read(buffer, 0, buffer.Length);
                        memoryStream.Write(buffer, 0, count);
                    } while (count != 0);

                    result = memoryStream.ToArray();
                }

                var values = new NameValueCollection();
                int indexFile = episodio.URLDownload.LastIndexOf('.');
                string extension = episodio.URLDownload.Substring(indexFile);
                string caminhoDownloadTorrent = ConfigurationSettings.AppSettings["CaminhoDownloadTorrent"].TrimEnd('\\');
                string filenameTorrent = caminhoDownloadTorrent;
                if (!Directory.Exists(filenameTorrent)) Directory.CreateDirectory(filenameTorrent);
                filenameTorrent += "\\" + episodio.Release + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + extension;

                using (BinaryWriter writer = new BinaryWriter(new FileStream(filenameTorrent, FileMode.Create)))
                {
                    writer.Write(result);
                }

                string caminhoDownloadSerie = ConfigurationSettings.AppSettings["CaminhoDownloadSerie"].TrimEnd('\\');

                string caminhoPasta = caminhoDownloadSerie + "\\" + FolderAndXMLAction.RecuperaNomePastaVideo(episodio.Release, tipoVideo);
                if (tipoVideo == TipoVideo.Filme) caminhoPasta += "\\" + releaseComando;
                caminhoPasta = caminhoPasta.Trim();

                if (!Directory.Exists(caminhoPasta)) Directory.CreateDirectory(caminhoPasta);

                string caminhoExeBitTorrent = ConfigurationSettings.AppSettings["CaminhoBitTorrent"];
                string argumentos = "/DIRECTORY \"" + caminhoPasta + "\" \"" + filenameTorrent + "\"";

                Process.Start(caminhoExeBitTorrent, argumentos);
            }
        }


        #endregion
    }
}
